package cn.csc.module.product.dal.mysql.category;

import cn.csc.framework.common.pojo.PageResult;
import cn.csc.framework.mybatis.core.mapper.BaseMapperX;
import cn.csc.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.csc.framework.mybatis.core.query.LambdaUpdateWrapperX;
import cn.csc.module.product.controller.admin.category.vo.CategoryCreateReqVO;
import cn.csc.module.product.controller.admin.category.vo.CategoryExportReqVO;
import cn.csc.module.product.controller.admin.category.vo.CategoryPageReqVO;
import cn.csc.module.product.controller.app.category.vo.AppCategorySearchReqVO;
import cn.csc.module.product.dal.dataobject.category.CategoryDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigInteger;
import java.util.List;
import java.util.Set;

/**
 * 分类信息 Mapper
 *
 * @author liuchuang
 */
@Mapper
public interface CategoryMapper extends BaseMapperX<CategoryDO> {

    default PageResult<CategoryDO> selectPage(CategoryPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<CategoryDO>()
                .eqIfPresent(CategoryDO::getShopId, reqVO.getShopId())
                .eqIfPresent(CategoryDO::getParentId, reqVO.getParentId())
                .likeIfPresent(CategoryDO::getName, reqVO.getName())
                .eqIfPresent(CategoryDO::getDescInfo, reqVO.getDescInfo())
                .eqIfPresent(CategoryDO::getPath, reqVO.getPath())
                .eqIfPresent(CategoryDO::getStatus, reqVO.getStatus())
                .eqIfPresent(CategoryDO::getIcon, reqVO.getIcon())
                .eqIfPresent(CategoryDO::getImgUrl, reqVO.getImgUrl())
                .eqIfPresent(CategoryDO::getLevel, reqVO.getLevel())
                .eqIfPresent(CategoryDO::getSeq, reqVO.getSeq())
                .betweenIfPresent(CategoryDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(CategoryDO::getId));
    }

    default List<CategoryDO> selectList(CategoryExportReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<CategoryDO>()
                .eqIfPresent(CategoryDO::getShopId, reqVO.getShopId())
                .eqIfPresent(CategoryDO::getParentId, reqVO.getParentId())
                .likeIfPresent(CategoryDO::getName, reqVO.getName())
                .eqIfPresent(CategoryDO::getDescInfo, reqVO.getDescInfo())
                .eqIfPresent(CategoryDO::getPath, reqVO.getPath())
                .eqIfPresent(CategoryDO::getStatus, reqVO.getStatus())
                .eqIfPresent(CategoryDO::getIcon, reqVO.getIcon())
                .eqIfPresent(CategoryDO::getImgUrl, reqVO.getImgUrl())
                .eqIfPresent(CategoryDO::getLevel, reqVO.getLevel())
                .eqIfPresent(CategoryDO::getSeq, reqVO.getSeq())
                .betweenIfPresent(CategoryDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(CategoryDO::getId));
    }

    default List<CategoryDO> selectList1(CategoryCreateReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<CategoryDO>()
                .eqIfPresent(CategoryDO::getShopId, reqVO.getShopId())
                .eqIfPresent(CategoryDO::getParentId, reqVO.getParentId())
                .eqIfPresent(CategoryDO::getStatus, reqVO.getStatus())
                .likeIfPresent(CategoryDO::getName, reqVO.getName())
                .orderByAsc(CategoryDO::getSeq));
    }

    default  int updateByParentId(CategoryDO categoryDO){
        LambdaUpdateWrapperX<CategoryDO> updateWrapperX=new LambdaUpdateWrapperX();
        updateWrapperX.set(CategoryDO::getStatus,categoryDO.getStatus());
        updateWrapperX.set(CategoryDO::getItemNum,categoryDO.getItemNum());
        updateWrapperX.eq(CategoryDO::getParentId,categoryDO.getId());
          return update(null,updateWrapperX);
    }

    /**
     * 查询类目下商品数量最多的前10个类目
     * @return
     */
     List<CategoryDO> recommendList();

    /**
     * 查询大类目下所有的第三级类目
     * @param id
     * @return
     */
     List<CategoryDO> topItemList(@Param("id") BigInteger id);

    /**
     * 获取分类列表(未删除的分类--启用、未启用状态， 用于分类管理)
     *
     * @param shopId 店铺id 必填
     * @return
     */
    List<CategoryDO> list(@Param("shopId") BigInteger shopId);


    /**
     * 获取分类列表(仅启用状态的分类)
     *
     * @param parentId 不填默认
     * @param shopId   店铺id 必填
     * @return
     */
    List<CategoryDO> listByShopIdAndParenId(@Param("shopId") BigInteger shopId, @Param("parentId") BigInteger parentId);

    List<CategoryDO> listByShopIdAndLevel(@Param("shopId") BigInteger shopId, @Param("level") Integer level);

    /**
     * 根据分类id 获取分类下的子分类
     *
     * @param categoryId
     * @return
     */
    List<CategoryDO> getChildCategory(@Param("categoryId") BigInteger categoryId);

    /**
     * 批量更新分类状态（启用、禁用）
     *
     * @param categoryIds
     * @param status
     * @return
     */
    int updateBatchOfStatus(@Param("categoryIds") List<BigInteger> categoryIds, @Param("status") Integer status);

    /**
     * 查询分类名是否存在
     *
     * @param category
     * @return
     */
    int existCategoryName(@Param("category") CategoryDO category);

    /**
     * 根据分类id列表，获取分类列表
     *
     * @param categoryIds
     * @return
     */
    List<CategoryDO> getListByCategoryIds(@Param("categoryIds") Set<BigInteger> categoryIds);

    /**
     * 获取分类id列表
     *
     * @param shopId   店铺id
     * @param parentId
     * @return
     */
    List<BigInteger> listCategoryId(@Param("shopId") BigInteger shopId, @Param("parentId") BigInteger parentId);

    /**
     * 获取分类及子分类的数据
     *
     * @param shopId
     * @param parentId
     * @return
     */
    List<CategoryDO> getCategoryAndChildCatogory(@Param("shopId") BigInteger shopId, @Param("parentId") BigInteger parentId);

    /**
     * 修改类目下的商品
     *
     * @param categoryIds
     */
    void updateProductNum(@Param("categoryIds") List<String> categoryIds, @Param("num") String num);

    /**
     * 修改自己类目数量多少
     * @param id
     * @param num
     */
    void updateItemNum(@Param("id") BigInteger id, @Param("num") String num);

    void delItem(CategoryDO category);

    int selectCountById(@Param("id") BigInteger id);

    List<CategoryDO> selectCategoryByLevel(AppCategorySearchReqVO reqVO);

    List<CategoryDO> listHighCategory();

    int updateByItem(CategoryDO categoryDO);

    List<CategoryDO> markLable(CategoryCreateReqVO reqVO);

}
